const Activity = require('../models/Activity');
const Group = require('../models/Group');
const User = require('../models/User');
const Joi = require('joi');

// 活动创建验证Schema
const createSchema = Joi.object({
  name: Joi.string().max(100).required(),
  description: Joi.string().max(500).allow(''),
  groupCount: Joi.number().integer().min(1).max(50).required()
});

// 活动更新验证Schema
const updateSchema = Joi.object({
  name: Joi.string().max(100),
  description: Joi.string().max(500).allow(''),
  groupCount: Joi.number().integer().min(1).max(50)
});

// 获取活动列表
exports.getActivities = async (req, res) => {
  try {
    const { page = 1, limit = 10 } = req.query;
    const skip = (page - 1) * limit;

    // 执行查询
    const activities = await Activity.find()
      .skip(skip)
      .limit(parseInt(limit))
      .sort({ createdAt: -1 })
      .populate('createdBy', 'username name');

    // 获取总数
    const total = await Activity.countDocuments();

    res.status(200).json({
      success: true,
      data: {
        activities,
        pagination: {
          currentPage: parseInt(page),
          totalPages: Math.ceil(total / limit),
          totalActivities: total
        }
      }
    });
  } catch (error) {
    console.error('获取活动列表错误:', error);
    res.status(500).json({
      success: false,
      message: '服务器内部错误',
      error: process.env.NODE_ENV === 'development' ? error.message : {}
    });
  }
};

// 获取活动详情
exports.getActivityById = async (req, res) => {
  try {
    const { id } = req.params;

    // 验证ID格式
    if (!id.match(/^[0-9a-fA-F]{24}$/)) {
      return res.status(400).json({
        success: false,
        message: '无效的活动ID'
      });
    }

    const activity = await Activity.findById(id)
      .populate('createdBy', 'username name');
    
    if (!activity) {
      return res.status(404).json({
        success: false,
        message: '活动不存在'
      });
    }

    // 获取活动相关的分组
    const groups = await Group.find({ activityId: id })
      .populate('members', 'username name status');

    res.status(200).json({
      success: true,
      data: {
        activity: {
          ...activity.toObject(),
          groups
        }
      }
    });
  } catch (error) {
    console.error('获取活动详情错误:', error);
    res.status(500).json({
      success: false,
      message: '服务器内部错误',
      error: process.env.NODE_ENV === 'development' ? error.message : {}
    });
  }
};

// 创建活动（仅管理员）
exports.createActivity = async (req, res) => {
  try {
    const { error, value } = createSchema.validate(req.body);
    if (error) {
      return res.status(400).json({
        success: false,
        message: '输入验证失败',
        error: error.details[0].message
      });
    }

    const { name, description, groupCount } = value;

    // 创建活动
    const activity = new Activity({
      name,
      description,
      groupCount,
      createdBy: req.user.userId
    });

    await activity.save();

    // 创建默认分组
    const groups = [];
    for (let i = 1; i <= groupCount; i++) {
      const group = new Group({
        name: `第${i}组`,
        activityId: activity._id,
        members: []
      });
      await group.save();
      groups.push(group);
    }

    res.status(201).json({
      success: true,
      message: '活动创建成功',
      data: {
        activity: {
          ...activity.toObject(),
          groups
        }
      }
    });
  } catch (error) {
    console.error('创建活动错误:', error);
    
    if (error.name === 'ValidationError') {
      return res.status(400).json({
        success: false,
        message: '数据验证失败',
        error: Object.values(error.errors).map(err => err.message)
      });
    }
    
    res.status(500).json({
      success: false,
      message: '服务器内部错误',
      error: process.env.NODE_ENV === 'development' ? error.message : {}
    });
  }
};

// 更新活动（仅管理员）
exports.updateActivity = async (req, res) => {
  try {
    const { id } = req.params;
    const updateData = req.body;

    // 验证ID格式
    if (!id.match(/^[0-9a-fA-F]{24}$/)) {
      return res.status(400).json({
        success: false,
        message: '无效的活动ID'
      });
    }

    // 验证更新数据
    const { error, value } = updateSchema.validate(updateData);
    if (error) {
      return res.status(400).json({
        success: false,
        message: '更新数据验证失败',
        error: error.details[0].message
      });
    }

    // 检查活动是否存在
    const activity = await Activity.findById(id);
    if (!activity) {
      return res.status(404).json({
        success: false,
        message: '活动不存在'
      });
    }

    // 更新活动信息
    const updatedActivity = await Activity.findByIdAndUpdate(
      id,
      { $set: value },
      { new: true, runValidators: true }
    );

    res.status(200).json({
      success: true,
      message: '活动更新成功',
      data: {
        activity: updatedActivity
      }
    });
  } catch (error) {
    console.error('更新活动错误:', error);
    
    if (error.name === 'ValidationError') {
      return res.status(400).json({
        success: false,
        message: '数据验证失败',
        error: Object.values(error.errors).map(err => err.message)
      });
    }
    
    res.status(500).json({
      success: false,
      message: '服务器内部错误',
      error: process.env.NODE_ENV === 'development' ? error.message : {}
    });
  }
};

// 删除活动（仅管理员）
exports.deleteActivity = async (req, res) => {
  try {
    const { id } = req.params;

    // 验证ID格式
    if (!id.match(/^[0-9a-fA-F]{24}$/)) {
      return res.status(400).json({
        success: false,
        message: '无效的活动ID'
      });
    }

    // 检查活动是否存在
    const activity = await Activity.findById(id);
    if (!activity) {
      return res.status(404).json({
        success: false,
        message: '活动不存在'
      });
    }

    // 删除相关分组
    await Group.deleteMany({ activityId: id });

    // 删除活动
    await Activity.findByIdAndDelete(id);

    res.status(200).json({
      success: true,
      message: '活动删除成功'
    });
  } catch (error) {
    console.error('删除活动错误:', error);
    res.status(500).json({
      success: false,
      message: '服务器内部错误',
      error: process.env.NODE_ENV === 'development' ? error.message : {}
    });
  }
};